package com.zyplayer.doc.wiki.controller;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.zyplayer.doc.core.annotation.AuthMan;
import com.zyplayer.doc.core.json.DocResponseJson;
import com.zyplayer.doc.data.repository.manage.entity.WikiCategory;
import com.zyplayer.doc.data.service.manage.WikiCategoryService;
import com.zyplayer.doc.wiki.controller.vo.WikiCategoryVo;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;

/**
 * wiki分类接口
 *
 * @author Max
 * @since 2023-03-16 16:51:59
 */
@Slf4j
@AuthMan
@RestController
@RequestMapping("/zyplayer-doc-wiki/category")
@RequiredArgsConstructor
public class WikiCategoryController {

    private final WikiCategoryService wikiCategoryService;


    @PostMapping("/list")
    public JSONObject list() {

        List<WikiCategory> wikiCategoryList =  wikiCategoryService.list();

        // 定义一个空数组，用来存放最终的树结构数据
        List<WikiCategoryVo> wikiCategoryVoList = new ArrayList<>();

        /**
         * 第一步遍历获取到的数据，将根节点数据存放 result 里
         * 遍历根节点
         * */
        for (WikiCategory test: wikiCategoryList) {
            // 判断是否是根节点，就是 parentId，这里是从 0 开始，如果 parentId 为 0 ，则表示根节点
            if (test.getPid() == 0) {
                // 这里可以将 entity 转为 DTO 存放
                // 如果字段不多可以直接使用 set get 方法来存取，就像这样
                WikiCategoryVo wikiCategoryVo = new WikiCategoryVo();
                wikiCategoryVo.setValue(test.getId().toString());
                wikiCategoryVo.setLabel(test.getTitle());
                // 如果字段太多，超过5个以上，还是建议使用 mapper 方法来转哦，具体如何使用 mapper 将 Entity 转为 DTO 请移步下方链接
                wikiCategoryVoList.add(wikiCategoryVo);
            }
        }

        /**
         * 根节点添加完就需要添加每个节点的子节点了，这里需要调用 递归方法 getChildren();
         * 遍历根节点数据，为其设置子节点集合
         *
         * */
        for (WikiCategoryVo test: wikiCategoryVoList) {
            // 获取子节点数据，传入 当前节点 id 和 所有 list
            List<WikiCategoryVo> childList = getChildren(test.getValue(), wikiCategoryList);
            // 将获取到的子节点集合添加到根节点里
            test.setChildren(childList);
        }

        // 将一层一层的树结构数据返回吧！

        String jsonTxt = DocResponseJson.ok(wikiCategoryVoList).toJson();
        String newJson = jsonTxt.replace("\"children\":[],","");


        JSONObject jsonObj = JSON.parseObject(newJson);

        return jsonObj;
    }

    /**
     * 获取子节点数据
     * @param id 父节点 ID
     * @param List<Test> tests 所有节点集合
     * @return 返回子节点列表
     */
    private List<WikiCategoryVo> getChildren(String id, List<WikiCategory> tests) {
        // 存在子节点数据
        List<WikiCategoryVo> childList = new ArrayList<>();
        // 遍历所有节点数据
        for (WikiCategory item : tests) {
            // 如果当前节点 ID 与父节点 ID 一致，表示当前数据是该节点的子节点
            if (item.getPid().toString().equals(String.valueOf(id))) {
                WikiCategoryVo wikiCategoryVo = new WikiCategoryVo();
                wikiCategoryVo.setValue(item.getId().toString());
                wikiCategoryVo.setLabel(item.getTitle());
                // 如果字段太多，超过5个以上，还是建议使用 mapper 方法来转哦，具体如何使用 mapper 将 Entity 转为 DTO 请移步下方链接
                childList.add(wikiCategoryVo);
            }
        }
        // 重点来了，递归调用
        for (WikiCategoryVo item : childList) {
            // 调用自身方法，依次添加子节点数据
            item.setChildren(getChildren(item.getValue(), tests));
        }
        // 如果当前节点无子节点数据添加空数据，递归退出
        if (childList.size() == 0) {
            return new ArrayList<>();
        }
        // 返回最终的子节点数据
        return childList;
    }
}

